﻿#include "BBHtml.h"
#include "BBPlayer.h"
#include <regex>
#include <iostream>

using namespace boost::filesystem;
namespace BB
{
	// 오직 Basketball Reference 사이트 parse 를 위한 
	// 클래스 이다. 
	class BBReference_Parse : public BBHtml
	{
		enum FILE_TYPE 
		{
			INDEX_PAGE = 0,
			INDIV_PLAYER,
			NULL_PAGE
		} _page_type; // 현재  페이지의 타입을 알아낸다.

		std::wstring file_name_generate(std::wstring site_addr)
		{
			if(site_addr.at(site_addr.length() - 1) == '/') site_addr.erase(site_addr.end() - 1);
			std::wregex player_index(L"www\\.basketball\\-reference\\.com/players/[a-z]$"); // 선수들 쭉 모아놓은 목록
			std::wregex player(L"www\\.basketball\\-reference\\.com/players/[a-z]/"); // 선수 개개의 페이지
			if(std::regex_search(site_addr, player_index))
			{
				_page_type = INDEX_PAGE; // 지금 이 페이지는 (플레이어들의 목록만 나온) 인덱스 페이지 이다. 

				// 그렇다면 어떤 알파벳인지 알아낸다. (성의 첫 글자를 기준으로 사람들을 분류함)
				std::wstring alpha(site_addr.end() - 1, site_addr.end());
				return L"D:\\BBdatabase\\player\\"+ alpha + L"\\index"; 
			}
			else if(std::regex_search(site_addr, player))
			{
				_page_type = INDIV_PLAYER; // 개개 플레이어의 정보가 나온 페이지 이다.

				size_t found = site_addr.find_last_of(L"/");
				size_t found_end = site_addr.find_last_of(L".");
				std::wstring name = site_addr.substr(found + 1, found_end - found - 1); // found 부터 found_end 까지 이 사람의 이름에 해당

				// 이 웹사이트는 각각의 사람의 '성' 을 본따서 웹페이지를 구성하여서 아래와 같이 하면 제대로 분류 가능
				std::wstring alpha = site_addr.substr(found + 1, 1); 
				return L"D:\\BBdatabase\\player\\" + alpha + L"\\" +name; 
			}
			return L""; 
		}
		
		void index_crawler(); // 선수들 목록을 받으며 index 페이지에 있는 모든 선수들 개개의 정보 데이터 베이스를 구축한다.
		void player_crawler(std::vector<std::wstring>& data); // 선수 개개 정보들을 얻어오는 작업을 한다. 

	public:
		BBReference_Parse(std::wstring site_addr) : BBHtml(site_addr, file_name_generate(site_addr))
		{
			if(_page_type == INDEX_PAGE)
			{
				index_crawler();
			}
			else if(_page_type == INDIV_PLAYER)
			{
				
			}
			else if(_page_type == NULL_PAGE)
			{
			}
		}
	};

	// Basketball Reference 에서 받은 데이터들을 Load 하기 위한
	// 클래스 이다. 
	class BBReference_Load
	{
		std::vector<BBPlayer *> player; 
		void load_player_data(std::wifstream& file);

	public:
		BBReference_Load()
		{
			path bb_database(L"D:\\BBdatabase\\player");

			// 만일 데이터베이스가 구축되어 있지 않다면
			if(!exists(bb_database))
				throw Exception(Exception::NO_DATABASE_DIRECTORY);
			directory_iterator end_itr;

			for(directory_iterator itr(bb_database); itr != end_itr; itr ++)
			{
				// 만일 디렉토리라면 (즉 a,b,c ... 폴더)
				if(is_directory(itr->status()))
				{
					path bb_player_folder = itr->path();
					for(directory_iterator itr_inside(bb_player_folder); itr_inside != end_itr; itr_inside ++)
					{
						// 만일 파일이라면
						if(is_regular_file(itr_inside->status()))
						{
							std::wstring file_name = itr_inside->path().wstring(); 

							// 플레이어의 정보를 담고 있는 파일이라면
							if(file_name.find(L"_PLAYER_DAT") != std::wstring::npos)
							{
								std::wifstream file(file_name);
								load_player_data(file); // 데이터 로드!
							}
						}
					}
				}
			}
		}
	};
}